//
// Author: Vladimir Migashko <migashko@gmail.com>, (C) 2011
//
// Copyright: See COPYING file that comes with this distribution
//

#ifndef HITLIST_IHITLIST_HPP
#define HITLIST_IHITLIST_HPP

#include <ctime>
#include <vector>
#include "types.hpp"
#include "hit_item.hpp"

/** @brief Интерфейс для хитлиста */
struct ihitlist
{
  virtual ~ihitlist() {}

  /** @brief Просмотры пользователя за день
   *  @param first_id идентификатор пользователя 
   *  @return количество хитов first_id за день
   * 
   * Cколько раз его смотрели пользователя за последние 24 часа
   */
  virtual size_t hits_day(user_id_t first_id) const = 0;
  
  /** @brief Уникальные просмотры пользователя за день
   *  @param first_id идентификатор пользователя
   *  @return количество уникальных хитов first_id за день
   * 
   * Cколько раз его смотрели пользователя за последние 24 часа 
   * без учета повторных просмотров
   */
  virtual size_t hosts_day(user_id_t first_id) const = 0;

  /** @brief Просмотры пользователя за месяц
   *  @param first_id идентификатор пользователя 
   *  @return количество хитов first_id за месяц
   *
   * Cколько раз его смотрели пользователя за последние 24*30 часов
   */
  virtual size_t hits_month(user_id_t first_id) const = 0;

  /** @brief Уникальные просмотры пользователя за месяц
   *  @param first_id идентификатор пользователя
   *  @return количество уникальных хитов first_id за месяц
   *
   * Cколько раз его смотрели пользователя за последние 24*30 часов
   * без учета повторных просмотров
   */
  virtual size_t hosts_month(user_id_t first_id) const = 0;

  /** @brief Регистрация хита пользователя с текущим временем (time(0))
    * @param first_id идентификатор пользователя кого смотрели
    * @param second_id идентификатор пользователя кто смотрели
    * @return true если хит добавлен
    *
    * Хит может быть не добавлен в случае временнОй рассинхронизации,
    * когда текущее время меньше ранее добавленного хита методом hit 
    * с тремя параметрами
    * @see ihitlist::hit(user_id_t, user_id_t, time_t)
    */
  virtual bool hit(user_id_t first_id, user_id_t second_id) = 0;

  /** @brief Регистрация хита пользователя с заданым временем
    * @param first_id идентификатор пользователя кого смотрели
    * @param second_id идентификатор пользователя кто смотрели
    * @param hit_time Время простмотра unix timespan
    * @return true если хит добавлен
    *
    * Хит может быть не добавлен в случае временнОй рассинхронизации,
    * когда текущее время меньше ранее добавленного хита. Параметр hit_time
    * каждого последующего вызова для пары first_id и second_id должен быть
    * больше или равен всех предыдущих 
    */
  virtual bool hit(user_id_t first_id, user_id_t second_id, time_t hit_time) = 0;

  /** @brief Получить список просмотров пользователя за день.
   * @param first_id идентификатор пользователя кого смотрели
   * @param offset
   * @param limit
   * @param hl вектор, куда будет скопирован результат
   * @see hit_item
   */
  virtual void day_hitlist( user_id_t first_id, size_t offset, size_t limit, std::vector<hit_item>& hl ) const = 0;

  /** @brief Получить список просмотров пользователя за месяц.
   * @param first_id идентификатор пользователя кого смотрели
   * @param offset
   * @param limit
   * @param hl вектор, куда будет скопирован результат
   * @see hit_item
   */
  virtual void month_hitlist( user_id_t first_id, size_t offset, size_t limit, std::vector<hit_item>& hl ) const = 0;
};

#endif

